package cn.itcast.streaming.utils;


import org.apache.commons.lang3.StringUtils;

/**
 * 自定义告警规则计算的工具类、
 * 1）实现按照操作运算符的相关方法 (加。减 乘 除 ）根据传递的操作运算符调用不同的方法
 * 2）实现规则运算符的方法
 * 3）实现逻辑运算符的方法
 * 4）实现自定义告警规则表达式的方法
 */
public class CustomRuleUtil {

    private static double addition(double x,double y){return x+y;}
    private static double subtract(double x,double y){return x-y;}
    private static double multiplication(double x,double y){return x*y;}
    private static double division(double x,double y){return x/y;}

    private static double operator(double x,double y,String z){
        if(StringUtils.equals(z,"+")){
            return addition(x,y);
        }else if(StringUtils.equals(z,"-")){
            return subtract(x,y);
        }else if(StringUtils.equals(z,"*")){
            return multiplication(x,y);
        }else if(StringUtils.equals(z,"/")){
            return division(x,y);
        }else {
            return x;
        }
    }

    //2）实现规则运算符的方法
    private static boolean ruleSymbol(double x,double y,String z){
        if(StringUtils.equals(z,">") && x>y){
            return true;
        }else if(StringUtils.equals(z,">=") && x>=y){
            return true;
        }else if(StringUtils.equals(z,"<") && x<y){
            return true;
        }else if(StringUtils.equals(z,"<=") && x<=y){
            return true;
        }else if(StringUtils.equals(z,"==") && x==y){
            return true;
        } else {
            return false;
        }
    }

    //3）实现逻辑运算符的方法
    private static boolean logicalSymbol(boolean x,boolean y,String z){
        if(StringUtils.equals(z,"&&")){
            return x && y;
        }else if(StringUtils.equals(z,"||")){
            return x || y;
        }else if(StringUtils.isEmpty(z) && x){
            return true;
        }else {
            return false;
        }
    }


    /**
     * 4.实现自定义告警规则表达式的方法
     * 如果告警规则包含的字段只有两个，只需要调用一次该方法
     * 如果告警规则包含的字段有三个或四个，只需要调用两次该方法
     * 如果两次表达式返回的结果都为true，则报警，反之不报警（前后两个表达式的计算结果是逻辑且的关系(写死的)，字段与字段之间是自定义关系）
     * @param v1  字段1       or alarm_param2_field
     * @param v2  字段2       alarm_param1_field or alarm_param2_field
     * @param v3  operator1     操作符 + - * /
     * @param v4  告警字段1的阈值  alarm_threshold1
     * @param v5  字段1的规则符号  rule_symbol1 < > <= >= ==
     * @param v6  告警字段2的阈值  alarm_threshold2
     * @param v7  字段2的规则符号  rule_symbol2 < > <= >= ==
     * @param v8  逻辑运算符
     * @return
     */
    public static boolean expression(double v1,double v2,String v3,String v4,String v5,String v6,String v7,String v8){
        System.out.println("v1-v8:"+v1+" "+v2+" "+v3+" "+v4+" "+v5+" "+v6+" "+v7+" "+v8);
        return logicalSymbol(
                //将两个字段的值计算后与阈值1进行判断，如果符合阈值的条件，则为真
                ruleSymbol(operator(v1,v2,v3),Double.parseDouble(v4),v5),
                //将两个字段的值计算后与阈值2进行判断，如果符合阈值的条件，则为真
                ruleSymbol(operator(v1,v2,v3),Double.parseDouble(v6),v7),
                v8
        );
    }

    public static void main(String[] args) {
        System.out.println(expression(5,0,"+","60","<=","5","<",null));
        //v1-v8:  5.0   0.0 + 60 <= 5 < null
        //v1-v8:  0.0   0.0 + 60 <= 5 < &&
        //v1-v8:  3.871 0.0 * 10 >  > > null
    }

}
